package com.it.gmall.payment.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.it.gmall.model.enums.PaymentStatus;
import com.it.gmall.model.enums.PaymentType;
import com.it.gmall.model.order.OrderInfo;
import com.it.gmall.model.payment.PaymentInfo;
import com.it.gmall.mq.consts.MqConst;
import com.it.gmall.mq.service.SendMsgService;
import com.it.gmall.payment.mapper.OrderInfoMapper;
import com.it.gmall.payment.mapper.PaymentInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@Service
public class PayServiceImpl implements PayService {
    @Autowired
    private OrderInfoMapper orderInfoMapper;
    @Autowired
    private PaymentInfoMapper paymentInfoMapper;
    @Autowired
    private SendMsgService sendMsgService;

    // 生成一张支付表 供财务系统使用 并返回这张表的信息
    @Override
    public PaymentInfo savePaymentInfo(Long orderId, PaymentType paymentType) {
        // 根据订单id查询信息
        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);

        // 根据对外交易业务编号查看是否已经生成了这张表
        // 用户点了支付宝支付没有支付 又退出来 换成微信支付 会产生幂等性问题
        // 防止幂等问题
        String outTradeNo = orderInfo.getOutTradeNo();
        PaymentInfo paymentInfo = paymentInfoMapper.selectOne(
                new QueryWrapper<PaymentInfo>().eq("out_trade_no", outTradeNo));
        if(null == paymentInfo){ // 数据库中不存在这个支付表 生成
            paymentInfo = new PaymentInfo();
            paymentInfo.setOutTradeNo(outTradeNo); // 对外交易业务编号
            paymentInfo.setOrderId(orderId); // 订单id
            paymentInfo.setPaymentType(paymentType.name()); // 支付类型 支付宝/微信
            paymentInfo.setTotalAmount(orderInfo.getTotalAmount()); // 支付的总金额
            paymentInfo.setSubject(orderInfo.getTradeBody()); // 交易内容
            paymentInfo.setPaymentStatus(PaymentStatus.UNPAID.name()); // 支付状态 -- 支付中
            paymentInfo.setCreateTime(new Date()); // 创建时间
            // 新增数据
            paymentInfoMapper.insert(paymentInfo);
        }else {
            paymentInfo.setPaymentStatus(PaymentStatus.UNPAID.name()); // 修改支付状态
            paymentInfo.setPaymentType(paymentType.name()); // 修改支付类型 微信/支付宝
            // 更新数据
            paymentInfoMapper.updateById(paymentInfo);
        }

        return paymentInfo;
    }

    // 修改信息到支付表中
    @Override
    public void updatePaymentInfo(Map<String, String> notifyMap) {
        // 先查出来这个支付信息
        String out_trade_no = notifyMap.get("out_trade_no");
        PaymentInfo paymentInfo = paymentInfoMapper.selectOne(
                new QueryWrapper<PaymentInfo>().eq("out_trade_no", out_trade_no));
        // 幂等问题
        // 这个支付表存在 而且 支付状态未支付中 进行修改
        if(null!=paymentInfo && PaymentStatus.UNPAID.name().equals(paymentInfo.getPaymentStatus())){
            // 回调体
            paymentInfo.setCallbackContent(notifyMap.toString());
            // 支付宝交易流水
            paymentInfo.setTradeNo(notifyMap.get("trade_no"));
            // 回调时间
            try {
                Date notifyTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(notifyMap.get("notify_time"));
                paymentInfo.setCallbackTime(notifyTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            // 支付状态 支付中 -> 已支付
            paymentInfo.setPaymentStatus(PaymentStatus.PAID.name());
            // 更新支付表
            paymentInfoMapper.updateById(paymentInfo);
            // 通知订单微服务 更改订单信息
            sendMsgService.sendMsg(MqConst.EXCHANGE_DIRECT_PAYMENT_PAY,MqConst.ROUTING_PAYMENT_PAY,paymentInfo.getOrderId());
        }
    }

    /*total_amount=2.00
    &buyer_id=20****7
    &body=大乐透2.1
    &trade_no=2016071921001003030200089909
    &refund_fee=0.00
    &notify_time=2016-07-19 14:10:49
    &subject=大乐透2.1
    &sign_type=RSA2
    &charset=utf-8
    &notify_type=trade_status_sync
    &out_trade_no=0719141034-6418
    &gmt_close=2016-07-19 14:10:46
    &gmt_payment=2016-07-19 14:10:47
    &trade_status=TRADE_SUCCESS
    &version=1.0
    &sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=
    &gmt_create=2016-07-19 14:10:44
    &app_id=20151*****3
    &seller_id=20881021****8
    &notify_id=4a91b7a78a503640467525113fb7d8bg8e*/
}
